package niuke.offer;

import java.util.Arrays;

/**
 * @Author:xjk
 * @Date 2019/6/30 16:30
 * 扑克牌顺子
 * 题目描述
 * LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...
 * 他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿！！
 * “红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....
 * LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。
 * 上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦。
 * 现在,要求你使用这幅牌模拟上面的过程,然后告诉我们LL的运气如何，
 * 如果牌能组成顺子就输出true，否则就输出false。
 * 为了方便起见,你可以认为大小王是0。
 */
public class IsContinuous {
    /**
     * 循环两次,先计算出有多少个0，在计算0的个数能不能补全数组中的差距
     * @param numbers
     * @return
     */
    public boolean isContinuous(int [] numbers) {
        if (numbers == null || numbers.length < 5) {
            return false;
        }
        Arrays.sort(numbers);
        int zeroCount = 0;
        for (int number : numbers) {
            if (number != 0) {
                break;
            }
            zeroCount++;
        }
        int start = zeroCount;
        while (start < numbers.length - 1) {
            int diff = numbers[start + 1] - numbers[start];
            if (diff - 1 > zeroCount || diff == 0) {
                return false;
            }
            zeroCount -= diff - 1;
            start++;
        }
        return true;
    }

    /**
     * 满足条件
     * 1 max - min <5
     * 2 除0外没有重复的数字(牌)
     * @param numbers
     * @return
     */
    public boolean isContinuous_(int[] numbers) {
        if (numbers == null || numbers.length == 0) {
            return false;
        }
        //申请一个辅助数组, 判断每个数出现的次数, 如果次数超过1, 则说明出现了对子
        int[] help = new int[14];
        int max = -1;
        int min = 14;
        for (int number : numbers) {
            help[number]++;
            if (number == 0) {
                continue;
            }
            if (help[number] > 1) {
                return false;
            }
            if (max < number) {
                max = number;
            }
            if (min > number) {
                min = number;
            }
        }
        if (max - min < 5) {
            return true;
        }
        return false;
    }
}
